# 导入随机数的模块
import random
# 导入游戏引擎窗口
from game import Window
# 导入实体类
from entity.Plane import planeFactory
from entity.Bullet import bulletFactory
from entity.Enemy import enemyFactory
from entity.Boom import boomFactory

# 继承基本游戏窗口类 - 实现自己的游戏逻辑
class MyWindow(Window):
    
    # 游戏的初始化方法
    def init(self):
        self.plane = planeFactory.create(self.width // 2, self.heigth)

    # 游戏时间更新
    def nextTime(self):
        self.time += 1
        if self.time == 400:
            self.time = 0

    # 用于生成游戏过程中的新对象
    def createNewObj(self):
        if self.time % 5 == 0:
            bulletFactory.create(self.plane.x, self.plane.y)
            if self.time % 40 == 0:
                enemyFactory.create(random.randint(0, self.width), 0)

                # print('\r当前子弹的数量是：', len(bulletFactory.list), '当前敌机的数量是：', len(enemyFactory.list), end='')

    # 用于移动游戏中所有对象
    def moveAllObj(self):
        # 移动子弹、敌人 和 爆炸特效
        l = bulletFactory.list + enemyFactory.list + planeFactory.list + boomFactory.list
        for i in l:
            i.move(self.keyList)

    # 刷新所有对象 - 超出屏幕的时候要删除对应的飞机
    def refreshAllObj(self):
        # 清理子弹的工厂类
        bulletFactory.flush(self.width, self.heigth)
        # 清理敌机的工厂类
        enemyFactory.flush(self.width, self.heigth)
        # 清理爆炸的工厂类
        boomFactory.flush(self.width, self.heigth)
        # 检测飞机和敌机是否碰撞 - 游戏结束
        for i in enemyFactory.list:
            if i.isCollision(self.plane):
                self.plane.isDie = True
        # 检测敌机和子弹是否碰撞 - 删除子弹和敌机
        for i in bulletFactory.list:
            for j in enemyFactory.list:
                if i.isCollision(j):
                    i.isDie = True
                    j.isDie = True
                    boomFactory.create(j.x, j.y)
        # 检测自己是否死亡
        if self.plane.isDie:
            # 关闭窗口
            exit()

    # 显示所有对象
    def showAllObj(self):
        # 显示子弹和敌人
        l = bulletFactory.list + enemyFactory.list + boomFactory.list
        for i in l:
            i.show(self)
        # 显示自己飞机
        self.show(self.plane)

    # 对象主循环
    def objLoop(self):
        # 创建新的对象
        self.createNewObj()
        # 擦除画板所有内容
        self.canvas.delete('all')
        # 移动所有对象
        self.moveAllObj()
        # 刷新所有对象
        self.refreshAllObj()
        # 显示所有对象
        self.showAllObj()

    # 游戏主循环
    def gameloop(self):
        # 更新游戏时间
        self.nextTime()
        # 对象主循环
        self.objLoop()
        # 设置定时器 10毫秒
        self.root.after(10, self.gameloop)

# 创建窗口对象
app = MyWindow(800, 800, '飞机大战')

# 进入游戏主循环
app.run()
